#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>

// 标准信号响应函数
// sig: 触发该响应函数的信号
// 谨慎访问共享资源（如全局变量）
void sighandler(int sig)
{
    switch(sig)
    {
    case SIGINT:
        printf("收到了SIGINT\n");
        break;
    case SIGQUIT:
        printf("收到了SIGQUIT\n");
        break;
    }
}

// 扩展信号响应函数
void sigaction_handler(int sig, siginfo_t *info, void *arg)
{
    switch(sig)
    {
    case SIGINT:
        fprintf(stderr, "收到了SIGI");
        sleep(20);
        printf("NT\n");
        printf("额外参数: %d\n", info->si_int);
        break;
    case SIGQUIT:
        printf("收到了SIGQUIT\n");
        printf("额外参数: %d\n", info->si_int);
        break;
    }
}

int main(int argc, char const *argv[])
{
    // 1, 忽略信号
    // signal(SIGINT, SIG_IGN);

    // 2， 捕捉信号
    struct sigaction act;
    bzero(&act, sizeof(act));
    act.sa_sigaction = sigaction_handler;
    act.sa_flags    |= SA_SIGINFO; // 选择扩展信号响应函数（而非标准响应函数）
    act.sa_flags    |= SA_RESTART; // 将来被该信号中断的函数会被自动重启
    sigemptyset(&act.sa_mask);     // 在执行响应函数的期间临时地屏蔽这些sa_mask中的信号
    sigaddset(&act.sa_mask, SIGQUIT);
    sigaction(SIGINT, &act, NULL);
    sigaction(SIGQUIT, &act, NULL);

    while(1)
    {
        int n;
        while((n=read(fd, buf, total)) == -1 && errno == EINTR);

        if(n == -1)
        {
            perror("read() failed");
            break;
        }

        // total -= n;
        
    }

    // // 3, 屏蔽某些信号（即设置信号阻塞掩码）（延迟响应，延迟到解除屏蔽）
    //       这些屏蔽的信号会一直被延迟，直到解除为止
    // sigset_t sigs;
    // sigemptyset(&sigs);
    // sigaddset(&sigs, SIGINT);
    // sigaddset(&sigs, SIGQUIT);
    // sigprocmask(SIG_BLOCK, &sigs, NULL);  // 将当前进程的屏蔽信号集设置为 sigs|当前正在屏蔽的信号
    // sigprocmask(SIG_SETMASK, &sigs, NULL);// 将当前进程的屏蔽信号集设置为 sigs

    // for(int i=0; i<26; i++)
    // {
    //     fprintf(stderr, "%c", 'a'+i);
    //     usleep(200*1000);
    // }

    // // 解除屏蔽
    // sigprocmask(SIG_UNBLOCK, &sigs, NULL);
    for(int i=0; ; i++, i%=26)
    {
        fprintf(stderr, "%c", 'a'+i);
        usleep(200*1000);
    }

    return 0;
}
